package org.opencms.free.balance;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;

/**
 * Clase que implementa la interfaz de persistencia de los objetos
 * BalanceFreeNode.
 */
public class BalanceFreeNodeDaoImpl implements BalanceFreeNodeDao {

	/**
	 * Metodo que borra de la base de datos un objeto de tipo
	 * BalanceFreeNodeDao.
	 */
	public void deleteNode(final BalanceFreeNode node) {
		try {
			// Se obtiene el nombre de la BD
			String databaseName = Messages.get().getBundle().key(
					Messages.DATABASE_NAME);
			// Se establece la conexion con la bd
			Connection con = OpenCms.getSqlManager()
					.getConnection(databaseName);
			PreparedStatement stmt = con
					.prepareStatement("DELETE FROM NODE WHERE NODE_ID = ?");
			stmt.setInt(1, node.getNodeId());
			stmt.execute();
			con.close();
		} catch (SQLException e) {
			CmsLog.INIT
					.info("Ha ocurrido un error mientras se eliminaba el nodo con id = "
							+ node.getNodeId());
		}
	}

	/**
	 * Metodo que busca un objeto de tipo BalanceFreeNode dado su nodeId.
	 */
	public BalanceFreeNode findNodes(final int nodeId) {
		BalanceFreeNode node = new BalanceFreeNode();
		try {
			// Se obtiene el nombre de la BD
			String databaseName = Messages.get().getBundle().key(
					Messages.DATABASE_NAME);
			// Se establece la conexion con la bd
			Connection con = OpenCms.getSqlManager()
					.getConnection(databaseName);
			PreparedStatement stmt = con
					.prepareStatement("SELECT NODE_ID, NODE_NAME, NODE_URL FROM NODE WHERE NODE_ID = ?");
			stmt.setInt(1, nodeId);
			ResultSet result = stmt.executeQuery();
			result.next();
			node.setNodeId(nodeId);
			node.setNodeName(result.getString("NODE_NAME"));
			node.setNodeUrl(result.getString("NODE_URL"));
			con.close();
		} catch (SQLException e) {
			CmsLog.INIT
					.info("Ha ocurrido un error mientras se obtenia el nodo con id = "
							+ nodeId);
		}
		return node;
	}

	/**
	 * Metodo que obtiene todos los objetos de tipo BalanceFreeNode de la BD.
	 */
	public List<BalanceFreeNode> findAllNodes() {
		List<BalanceFreeNode> nodes = new ArrayList();
		try {
			// Se obtiene el nombre de la BD
			String databaseName = Messages.get().getBundle().key(
					Messages.DATABASE_NAME);
			// Se establece la conexion con la bd
			Connection con = OpenCms.getSqlManager()
					.getConnection(databaseName);
			PreparedStatement stmt = con
					.prepareStatement("SELECT NODE_ID, NODE_NAME, NODE_URL FROM NODE");
			ResultSet result = stmt.executeQuery();
			if (result != null) {
				while (result.next()) {
					BalanceFreeNode node = new BalanceFreeNode();
					node.setNodeId(result.getInt("NODE_ID"));
					node.setNodeName(result.getString("NODE_NAME"));
					node.setNodeUrl(result.getString("NODE_URL"));
					nodes.add(node);
				}
			}
			con.close();
		} catch (SQLException e) {
			CmsLog.INIT
					.info("Ha ocurrido un error mientras se obtenian los nodos");
		}
		return nodes;
	}

	/**
	 * Metodo que guarda en base de datos un objeto de tipo BalanceFreeNodeDao.
	 */
	public void saveNode(final BalanceFreeNode node) {
		try {
			// Se obtiene el nombre de la BD
			String databaseName = Messages.get().getBundle().key(
					Messages.DATABASE_NAME);;
			// Se establece la conexion con la bd
			Connection con = OpenCms.getSqlManager()
					.getConnection(databaseName);
			PreparedStatement stmt = con
					.prepareStatement("INSERT INTO NODE (NODE_ID, NODE_NAME, NODE_URL) VALUES (NULL, ?, ?)");
			stmt.setString(1, node.getNodeName());
			stmt.setString(2, node.getNodeUrl());
			stmt.execute();
			con.close();
		} catch (SQLException e) {
			CmsLog.INIT
					.info("Ha ocurrido error mientras se guardaba el nodo "
							+ node.getNodeName());
		}
	}

	/**
	 * Metodo que actualiza en base de datos un objeto de tipo
	 * BalanceFreeNodeDao.
	 */
	public void updateNode(final BalanceFreeNode person) {
		try {
			// Se obtiene el nombre de la BD
			String databaseName = Messages.get().getBundle().key(
					Messages.DATABASE_NAME);
			// Se establece la conexion con la bd
			Connection con = OpenCms.getSqlManager()
					.getConnection(databaseName);
			PreparedStatement stmt = con
					.prepareStatement("UPDATE NODE WHERE NODE_ID = ? SET NODE_NAME = ?, NODE_URL = ?");
			stmt.setInt(1, person.getNodeId());
			stmt.setString(2, person.getNodeName());
			stmt.setString(3, person.getNodeUrl());
			stmt.execute();
			con.close();
		} catch (SQLException e) {
			CmsLog.INIT
					.info("Ha ocurrido error mientras se actualizaba el nodo con id = "
							+ person.getNodeId());
		}
	}
}